/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analiseSintatica.Regras.Funcao;

import analiseSintatica.Regras.*;
import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSemantica.Tipos.TiposSemanticos;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Expressoes.RegraExpressao;
import java.util.LinkedList;

/**
 *
 * @author Ivo Romário
 */
public class RegraArgsChamada extends Regra {

    protected static Regra instancia;
    protected String estrutura = "<expressao> {, <expressao>}";

    /**
     * Construtor privado necessario ao singleton
     */
    private RegraArgsChamada() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraArgsChamada getInstance() {
        if (instancia == null) {
            instancia = new RegraArgsChamada();
        }
        return (RegraArgsChamada) instancia;
    }

    @Override
    public TiposSemanticos analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
    	boolean errosemantico = false;
    	
        TiposSemanticos tiposExpressao = RegraExpressao.getInstance().analisar(listaTokens);
        if(tiposExpressao == null)
        	errosemantico = true;
        
        while (listaTokens.getFirst().getToken().equals("delimitador") && listaTokens.getFirst().getLexema().equals(",")) {
            reconheceLexema(listaTokens, "delimitador", ",", estrutura);
            TiposSemanticos temp = RegraExpressao.getInstance().analisar(listaTokens);
            if(temp == null)
            	errosemantico = true;
            else
            	tiposExpressao.addTipos(temp.removeTipos());
            
        }
        if(errosemantico)
        	return null;
        else
        	return tiposExpressao;
    }

    @Override
    protected void setPrimeiro() {
        this.primeiro = RegraExpressao.getInstance().getPrimeiro();
    }
}
